先來看以下這段程式碼:
setPlayer({
...player,
score: player.score + 1
});
要寫這麼費工的原因是,我們不能直接改player.score。
score: player.score + 1,代表和前面State裡變得不同的鍵值對。
…player則可以代表,需要和前面State裡保持一致的鍵值對。
另一個練習我們寫購物車的遞減按鈕,但從1減到0時要直接把項目移除。
首先自然是把遞增按鈕的程式碼複製過來,把綁定的事件處理函數改成handleDecreaseClick,邏輯只差在變成減一。
然後我的做法是直接在onClick這,用if判斷+filter濾出要保留的項目,再麻煩setProducts送出。
一開始條件設成p => p.count > 1,很開心想說寫完了。但此時萬一有兩個項目剛好都剩1的話,會一起被送走。所以要改成p => p.id != product.id,也就是保留「不符合if條件的id」所代表的項目,才能正確破關。
<button
onClick={() => {
handleDecreaseClick(product.id);
if (product.count < 2) {
setProducts(products.filter((p) => p.id != product.id));
}
}}
>
-
</button>